package com.pingan.webscoket;

import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import net.sf.json.JSONObject;

import com.pingan.util.SpringTimerTest;

/**
 * @ServerEndpoint 注解是一个类层次的注解，它的功能主要是将目前的类定义成一个websocket服务器端,
 * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
 */
@ServerEndpoint("/websocket")
public class WebSocketTest {
	
    //静态变量，用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;

    //concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话，可以使用Map来存放，其中Key可以为用户标识
    private static CopyOnWriteArraySet<WebSocketTest> webSocketSet = new CopyOnWriteArraySet<WebSocketTest>();

    //与某个客户端的连接会话，需要通过它来给客户端发送数据
    private Session session;

    /**
     * 连接建立成功调用的方法
     * @param session  可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(Session session){
        this.session = session;
        webSocketSet.add(this);     //加入set中
        addOnlineCount();           //在线数加1
        System.out.println("有新连接加入sesssionID为:"+session.getId()+"！当前在线人数为" + getOnlineCount());
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(){
        webSocketSet.remove(this);  //从set中删除
        subOnlineCount();           //在线数减1
        System.out.println("有一连接关闭！当前在线人数为" + getOnlineCount());
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     * @throws InterruptedException 
     */
    @OnMessage
    public void onMessage(String message, Session session) throws InterruptedException {
    	JSONObject fromObject = JSONObject.fromObject(message);
    	String controller = fromObject.getString("type");
    	String data = fromObject.getString("data");
        System.out.println("sesssionID为:"+session.getId()+"请求控制器Controller为:"+ controller+"请求数据Data为:"+data);
        switch (controller) {
		case "query":
			//群发消息
            for(WebSocketTest item: webSocketSet){
                try {
                	JSONObject jsobj = new JSONObject();
                	jsobj.put("sessionId",session.getId());
                	jsobj.put("message", message);
                	SpringTimerTest timerTest = new SpringTimerTest();
                	item.sendMessage(String.valueOf(jsobj));
                	while(true){
                		Thread.sleep(1000);
                		item.sendMessage(timerTest.print());
                	}
                } catch (IOException e) {
                    e.printStackTrace();
                    continue;
                }
            }
			break;
		case "update":
			System.out.println("update");
			break;
		case "add":
			System.out.println("add");
			break;
		case "delete":
			System.out.println("delete");
			break;
		default:
			break;
		}
        
        
        
        
    }

    /**
     * 发生错误时调用
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error){
        System.out.println("发生错误");
        error.printStackTrace();
    }

    /**
     * 为 每个用户群发消息
     * @param message
     * @throws IOException
     */
    public void sendMessage(String message) throws IOException{
        this.session.getBasicRemote().sendText(message);
        //this.session.getAsyncRemote().sendText(message);
    }

    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        WebSocketTest.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
        WebSocketTest.onlineCount--;
    }
    
   
    public static void main(String[] args) {
    
	}
    
    
}